package dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import to.Assinatura;
import to.AssinaturaEvento;
import to.ConteudoEvento;
import to.Curso;
import to.Evento;
import to.LocalEvento;
import to.Participante;
import to.ParticipanteEvento;
import to.TipoEvento;
import to.TipoParticipacao;
import util.HibernateUtil;

public class EventoDAO {

	public List<Curso> listaCurso() {

		List<Curso> listaCurso = new ArrayList<Curso>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Curso.class, "cur");
			criteria.addOrder(Order.asc("cur.nome"));
			listaCurso = (List<Curso>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaCurso;
	}

	public Curso buscarCursoPorCodigo(Integer id) {

		Curso c = new Curso();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Curso.class, "cur");
			criteria.add(Restrictions.eq("cur.id", id));
			c = (Curso) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return c;
	}

	public List<LocalEvento> listaLocais() {

		List<LocalEvento> lista = new ArrayList<LocalEvento>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(LocalEvento.class, "l");
			criteria.addOrder(Order.asc("l.descricao"));
			lista = (List<LocalEvento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}

	public LocalEvento buscarLocalPorCodigo(Integer id) {

		LocalEvento le = new LocalEvento();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(LocalEvento.class, "l");
			criteria.add(Restrictions.eq("l.id", id));
			le = (LocalEvento) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return le;
	}

	public List<Evento> listaTodosEventos() {

		List<Evento> listaEvento = new ArrayList<Evento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Evento.class, "ev");
			criteria.addOrder(Order.asc("ev.nomeEvento"));
			listaEvento = (List<Evento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaEvento;
	}

	public List<TipoParticipacao> listaTodosTiposParticipacao() {

		List<TipoParticipacao> listaTipo = new ArrayList<TipoParticipacao>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(TipoParticipacao.class,
					"tp");
			criteria.addOrder(Order.asc("tp.descricao"));
			listaTipo = (List<TipoParticipacao>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaTipo;
	}

	public TipoParticipacao buscarTipoPorCodigo(Integer id) {

		TipoParticipacao t = new TipoParticipacao();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(TipoParticipacao.class,
					"t");
			criteria.add(Restrictions.eq("t.id", id));
			t = (TipoParticipacao) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return t;
	}

	public List<ParticipanteEvento> listaParticipantePorEvento(Integer idEvento) {

		List<ParticipanteEvento> listaRetorno = new ArrayList<ParticipanteEvento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(ParticipanteEvento.class, "pe")
					.createAlias("pe.evento", "e")
					.createAlias("pe.participante", "p");
			criteria.add(Restrictions.eq("e.id", idEvento));
			criteria.addOrder(Order.asc("p.nome"));
			listaRetorno = (List<ParticipanteEvento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

	public List<ConteudoEvento> listaConteudoPorEvento(Integer idEvento) {

		List<ConteudoEvento> listaRetorno = new ArrayList<ConteudoEvento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(ConteudoEvento.class,
					"ce").createAlias("ce.evento", "e");
			criteria.add(Restrictions.eq("e.id", idEvento));
			criteria.addOrder(Order.asc("ce.data"));
			listaRetorno = (List<ConteudoEvento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

	public List<Assinatura> listaAssinatura() {

		List<Assinatura> lista = new ArrayList<Assinatura>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Assinatura.class, "a");
			criteria.addOrder(Order.asc("a.nome"));
			lista = (List<Assinatura>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}

	public List<AssinaturaEvento> listaAssinaturaPorEvento(Integer idEvento) {

		List<AssinaturaEvento> lista = new ArrayList<AssinaturaEvento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(AssinaturaEvento.class,
					"ae").createAlias("ae.evento", "e");
			criteria.add(Restrictions.eq("e.id", idEvento));
			lista = (List<AssinaturaEvento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}

	public List<Participante> buscaCPFInformado(String cpfInformado) {

		List<Participante> retornaCpf = new ArrayList<Participante>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Participante.class, "p");
			criteria.add(Restrictions.eq("p.cpf", cpfInformado));
			retornaCpf = (List<Participante>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return retornaCpf;
	}

	public Participante buscaParticipantePorCPF(String cpfInformado) {

		Participante p = new Participante();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Participante.class, "p");
			criteria.add(Restrictions.ilike("p.cpf", cpfInformado));
			p = (Participante) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return p;

	}

	public ParticipanteEvento buscaParticipantePorEvento(
			Integer idParticipante, Integer idEvento) {

		ParticipanteEvento pe = new ParticipanteEvento();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(ParticipanteEvento.class, "pe")
					.createAlias("pe.participante", "p")
					.createAlias("pe.evento", "e");
			criteria.add(Restrictions.eq("p.id", idParticipante));
			criteria.add(Restrictions.eq("e.id", idEvento));
			pe = (ParticipanteEvento) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return pe;

	}

	public List<ParticipanteEvento> buscaParticipanteCPFPorEvento(
			Integer idParticipante, Integer idEvento) {

		List<ParticipanteEvento> lista = new ArrayList<ParticipanteEvento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(ParticipanteEvento.class, "pe")
					.createAlias("pe.participante", "p")
					.createAlias("pe.evento", "e");
			criteria.add(Restrictions.eq("p.id", idParticipante));
			criteria.add(Restrictions.eq("e.id", idEvento));
			lista = (List<ParticipanteEvento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;

	}

	public List<TipoEvento> buscaTodosTiposEvento() {

		List<TipoEvento> lista = new ArrayList<TipoEvento>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(TipoEvento.class, "te");
			criteria.addOrder(Order.asc("te.descricao"));
			lista = (List<TipoEvento>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}

	public TipoEvento buscaTipoPorCodigo(Integer id) {

		TipoEvento te = new TipoEvento();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(TipoEvento.class, "te");
			criteria.add(Restrictions.eq("te.id", id));
			te = (TipoEvento) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return te;
	}

}
